<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Similarity module | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="index-modules.html" title="Index modules">
<link rel="prev" href="index-modules-merge.html" title="Merge">
<link rel="next" href="index-modules-slowlog.html" title="Slow Log">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="index-modules.html">Index modules</a></span>
»
<span class="breadcrumb-node">Similarity module</span>
</div>
<div class="navheader">
<span class="prev">
<a href="index-modules-merge.html">« Merge</a>
</span>
<span class="next">
<a href="index-modules-slowlog.html">Slow Log »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="index-modules-similarity"></a>Similarity module<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h2>
</div></div></div>
<p>A similarity (scoring / ranking model) defines how matching documents
are scored. Similarity is per field, meaning that via the mapping one
can define a different similarity per field.</p>
<p>Configuring a custom similarity is considered an expert feature and the
builtin similarities are most likely sufficient as is described in
<a class="xref" href="similarity.html" title="similarity"><code class="literal">similarity</code></a>.</p>
<h3>
<a id="configuration"></a>Configuring a similarity<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h3>
<p>Most existing or custom Similarities have configuration options which
can be configured via the index settings as shown below. The index
options can be provided when creating an index or updating index
settings.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /index
{
  "settings": {
    "index": {
      "similarity": {
        "my_similarity": {
          "type": "DFR",
          "basic_model": "g",
          "after_effect": "l",
          "normalization": "h2",
          "normalization.h2.c": "3.0"
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1037.console"></div>
<p>Here we configure the DFR similarity so it can be referenced as
<code class="literal">my_similarity</code> in mappings as is illustrate in the below example:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /index/_mapping
{
  "properties" : {
    "title" : { "type" : "text", "similarity" : "my_similarity" }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1038.console"></div>
<h3>
<a id="_available_similarities"></a>Available similarities<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h3>
<h4>
<a id="bm25"></a>BM25 similarity (<span class="strong strong"><strong>default</strong></span>)<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p>TF/IDF based similarity that has built-in tf normalization and
is supposed to work better for short fields (like names). See
<a href="http://en.wikipedia.org/wiki/Okapi_BM25" class="ulink" target="_top">Okapi_BM25</a> for more details.
This similarity has the following options:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">k1</code>
</p>
</td>
<td valign="top">
<p>
Controls non-linear term frequency normalization
(saturation). The default value is <code class="literal">1.2</code>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">b</code>
</p>
</td>
<td valign="top">
<p>
Controls to what degree document length normalizes tf values.
The default value is <code class="literal">0.75</code>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">discount_overlaps</code>
</p>
</td>
<td valign="top">
<p>
Determines whether overlap tokens (Tokens with
0 position increment) are ignored when computing norm. By default this
is true, meaning overlap tokens do not count when computing norms.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>Type name: <code class="literal">BM25</code></p>
<h4>
<a id="dfr"></a>DFR similarity<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p>Similarity that implements the
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/DFRSimilarity.html" class="ulink" target="_top">divergence
from randomness</a> framework. This similarity has the following options:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">basic_model</code>
</p>
</td>
<td valign="top">
<p>
Possible values: <a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/BasicModelG.html" class="ulink" target="_top"><code class="literal">g</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/BasicModelIF.html" class="ulink" target="_top"><code class="literal">if</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/BasicModelIn.html" class="ulink" target="_top"><code class="literal">in</code></a> and
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/BasicModelIne.html" class="ulink" target="_top"><code class="literal">ine</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">after_effect</code>
</p>
</td>
<td valign="top">
<p>
Possible values: <a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/AfterEffectB.html" class="ulink" target="_top"><code class="literal">b</code></a> and
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/AfterEffectB.html" class="ulink" target="_top"><code class="literal">l</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">normalization</code>
</p>
</td>
<td valign="top">
<p>
Possible values: <a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/Normalization.NoNormalization.html" class="ulink" target="_top"><code class="literal">no</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/NormalizationH1.html" class="ulink" target="_top"><code class="literal">h1</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/NormalizationH2.html" class="ulink" target="_top"><code class="literal">h2</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/NormalizationH1.html" class="ulink" target="_top"><code class="literal">h3</code></a> and
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/NormalizationZ.html" class="ulink" target="_top"><code class="literal">z</code></a>.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>All options but the first option need a normalization value.</p>
<p>Type name: <code class="literal">DFR</code></p>
<h4>
<a id="dfi"></a>DFI similarity<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p>Similarity that implements the <a href="http://trec.nist.gov/pubs/trec21/papers/irra.web.nb.pdf" class="ulink" target="_top">divergence from independence</a>
model.
This similarity has the following options:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">independence_measure</code>
</p>
</td>
<td valign="top">
<p>
Possible values
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/IndependenceStandardized.html" class="ulink" target="_top"><code class="literal">standardized</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/IndependenceSaturated.html" class="ulink" target="_top"><code class="literal">saturated</code></a>,
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/IndependenceChiSquared.html" class="ulink" target="_top"><code class="literal">chisquared</code></a>.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>When using this similarity, it is highly recommended <span class="strong strong"><strong>not</strong></span> to remove stop words to get
good relevance. Also beware that terms whose frequency is less than the expected
frequency will get a score equal to 0.</p>
<p>Type name: <code class="literal">DFI</code></p>
<h4>
<a id="ib"></a>IB similarity.<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p><a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/IBSimilarity.html" class="ulink" target="_top">Information
based model</a> . The algorithm is based on the concept that the information content in any symbolic <em>distribution</em>
sequence is primarily determined by the repetitive usage of its basic elements.
For written texts this challenge would correspond to comparing the writing styles of different authors.
This similarity has the following options:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">distribution</code>
</p>
</td>
<td valign="top">
<p>
Possible values:
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/DistributionLL.html" class="ulink" target="_top"><code class="literal">ll</code></a> and
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/DistributionSPL.html" class="ulink" target="_top"><code class="literal">spl</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">lambda</code>
</p>
</td>
<td valign="top">
<p>
Possible values:
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/LambdaDF.html" class="ulink" target="_top"><code class="literal">df</code></a> and
<a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/LambdaTTF.html" class="ulink" target="_top"><code class="literal">ttf</code></a>.
</p>
</td>
</tr>
<tr>
<td valign="top">
<p>
<code class="literal">normalization</code>
</p>
</td>
<td valign="top">
<p>
Same as in <code class="literal">DFR</code> similarity.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>Type name: <code class="literal">IB</code></p>
<h4>
<a id="lm_dirichlet"></a>LM Dirichlet similarity.<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p><a href="http://lucene.apache.org/core/8_5_1/core/org/apache/lucene/search/similarities/LMDirichletSimilarity.html" class="ulink" target="_top">LM
Dirichlet similarity</a> . This similarity has the following options:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">mu</code>
</p>
</td>
<td valign="top">
<p>
Default to <code class="literal">2000</code>.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>The scoring formula in the paper assigns negative scores to terms that have
fewer occurrences than predicted by the language model, which is illegal to
Lucene, so such terms get a score of 0.</p>
<p>Type name: <code class="literal">LMDirichlet</code></p>
<h4>
<a id="lm_jelinek_mercer"></a>LM Jelinek Mercer similarity.<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p><a href="http://lucene.apache.org/core/8_5_1/core/core/org/apache/lucene/search/similarities/LMJelinekMercerSimilarity.html" class="ulink" target="_top">LM
Jelinek Mercer similarity</a> . The algorithm attempts to capture important patterns in the text, while leaving out noise. This similarity has the following options:</p>
<div class="informaltable">
<table border="0" cellpadding="4px">
<colgroup>
<col>
<col>
</colgroup>
<tbody valign="top">
<tr>
<td valign="top">
<p>
<code class="literal">lambda</code>
</p>
</td>
<td valign="top">
<p>
The optimal value depends on both the collection and the query. The optimal value is around <code class="literal">0.1</code>
for title queries and <code class="literal">0.7</code> for long queries. Default to <code class="literal">0.1</code>. When value approaches <code class="literal">0</code>, documents that match more query terms will be ranked higher than those that match fewer terms.
</p>
</td>
</tr>
</tbody>
</table>
</div>
<p>Type name: <code class="literal">LMJelinekMercer</code></p>
<h4>
<a id="scripted_similarity"></a>Scripted similarity<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p>A similarity that allows you to use a script in order to specify how scores
should be computed. For instance, the below example shows how to reimplement
TF-IDF:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /index
{
  "settings": {
    "number_of_shards": 1,
    "similarity": {
      "scripted_tfidf": {
        "type": "scripted",
        "script": {
          "source": "double tf = Math.sqrt(doc.freq); double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; double norm = 1/Math.sqrt(doc.length); return query.boost * tf * idf * norm;"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "field": {
        "type": "text",
        "similarity": "scripted_tfidf"
      }
    }
  }
}

PUT /index/_doc/1
{
  "field": "foo bar foo"
}

PUT /index/_doc/2
{
  "field": "bar baz"
}

POST /index/_refresh

GET /index/_search?explain=true
{
  "query": {
    "query_string": {
      "query": "foo^1.7",
      "default_field": "field"
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1039.console"></div>
<p>Which yields:</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "took": 12,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
        "value": 1,
        "relation": "eq"
    },
    "max_score": 1.9508477,
    "hits": [
      {
        "_shard": "[index][0]",
        "_node": "OzrdjxNtQGaqs4DmioFw9A",
        "_index": "index",
        "_type": "_doc",
        "_id": "1",
        "_score": 1.9508477,
        "_source": {
          "field": "foo bar foo"
        },
        "_explanation": {
          "value": 1.9508477,
          "description": "weight(field:foo in 0) [PerFieldSimilarity], result of:",
          "details": [
            {
              "value": 1.9508477,
              "description": "score from ScriptedSimilarity(weightScript=[null], script=[Script{type=inline, lang='painless', idOrCode='double tf = Math.sqrt(doc.freq); double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; double norm = 1/Math.sqrt(doc.length); return query.boost * tf * idf * norm;', options={}, params={}}]) computed from:",
              "details": [
                {
                  "value": 1.0,
                  "description": "weight",
                  "details": []
                },
                {
                  "value": 1.7,
                  "description": "query.boost",
                  "details": []
                },
                {
                  "value": 2,
                  "description": "field.docCount",
                  "details": []
                },
                {
                  "value": 4,
                  "description": "field.sumDocFreq",
                  "details": []
                },
                {
                  "value": 5,
                  "description": "field.sumTotalTermFreq",
                  "details": []
                },
                {
                  "value": 1,
                  "description": "term.docFreq",
                  "details": []
                },
                {
                  "value": 2,
                  "description": "term.totalTermFreq",
                  "details": []
                },
                {
                  "value": 2.0,
                  "description": "doc.freq",
                  "details": []
                },
                {
                  "value": 3,
                  "description": "doc.length",
                  "details": []
                }
              ]
            }
          ]
        }
      }
    ]
  }
}</pre>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>While scripted similarities provide a lot of flexibility, there is
a set of rules that they need to satisfy. Failing to do so could make
Elasticsearch silently return wrong top hits or fail with internal errors at
search time:</p>
</div>
</div>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
Returned scores must be positive.
</li>
<li class="listitem">
All other variables remaining equal, scores must not decrease when
<code class="literal">doc.freq</code> increases.
</li>
<li class="listitem">
All other variables remaining equal, scores must not increase when
<code class="literal">doc.length</code> increases.
</li>
</ul>
</div>
<p>You might have noticed that a significant part of the above script depends on
statistics that are the same for every document. It is possible to make the
above slightly more efficient by providing an <code class="literal">weight_script</code> which will
compute the document-independent part of the score and will be available
under the <code class="literal">weight</code> variable. When no <code class="literal">weight_script</code> is provided, <code class="literal">weight</code>
is equal to <code class="literal">1</code>. The <code class="literal">weight_script</code> has access to the same variables as
the <code class="literal">script</code> except <code class="literal">doc</code> since it is supposed to compute a
document-independent contribution to the score.</p>
<p>The below configuration will give the same tf-idf scores but is slightly
more efficient:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /index
{
  "settings": {
    "number_of_shards": 1,
    "similarity": {
      "scripted_tfidf": {
        "type": "scripted",
        "weight_script": {
          "source": "double idf = Math.log((field.docCount+1.0)/(term.docFreq+1.0)) + 1.0; return query.boost * idf;"
        },
        "script": {
          "source": "double tf = Math.sqrt(doc.freq); double norm = 1/Math.sqrt(doc.length); return weight * tf * norm;"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "field": {
        "type": "text",
        "similarity": "scripted_tfidf"
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1040.console"></div>
<p>Type name: <code class="literal">scripted</code></p>
<h4>
<a id="default-base"></a>Default Similarity<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/similarity.asciidoc">edit</a>
</h4>
<p>By default, Elasticsearch will use whatever similarity is configured as
<code class="literal">default</code>.</p>
<p>You can change the default similarity for all fields in an index when
it is <a class="xref" href="indices-create-index.html" title="Create index API">created</a>:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT /index
{
  "settings": {
    "index": {
      "similarity": {
        "default": {
          "type": "boolean"
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1041.console"></div>
<p>If you want to change the default similarity after creating the index
you must <a class="xref" href="indices-open-close.html" title="Open index API">close</a> your index, send the following
request and <a class="xref" href="indices-open-close.html" title="Open index API">open</a> it again afterwards:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /index/_close

PUT /index/_settings
{
  "index": {
    "similarity": {
      "default": {
        "type": "boolean"
      }
    }
  }
}

POST /index/_open</pre>
</div>
<div class="console_widget" data-snippet="snippets/1042.console"></div>
</div>
<div class="navfooter">
<span class="prev">
<a href="index-modules-merge.html">« Merge</a>
</span>
<span class="next">
<a href="index-modules-slowlog.html">Slow Log »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
